6
תגובות

סינגלטון טוב ?

פתח משהה ,
אז אחרי שקראתי על סינגלטון , לקחתי על עצמי לעשות סינגלטון עם הקונסטרקט ולאו דווקא עם פונקציה סטטית אחרת. ניסיתי לחשוב על אפשרות למשתנה מחוץ לקלאס, ואז להשתמש בGLOBALS אבל חשבתי שאולי יש דרך אחרת, אז ניסיתי את זאת. אחרי שהסתכלתי שוב, שמתי לב שכול פעם שמגדירים את הקלאס המאפיין instance הופך ישירות לNULL ואז אין כל טעם כי הבדיקה תמיד תראה שהוא ריק (כי תכלס זה נכון, הוא הוגדר מחדש כריק) אז הבנתי שעשיתי פה משו דפוק .. יש לכם הצעות או משו לגבי איך לשנות אתזה, שinstance לא יוגדר בכול מופע חדש של הקלאס? או שאין אפשרות כזאת והאפשרות היחידה היא להשתמש בGLOBALS ?


class db extends PDO {

private static $instance = null;
    public function __construct($dsn, $username, $password, $driver_options = array()) {
        if (self::$instance === null ) // check instance ;
        {
            $options = array_merge($this->bulidin_options,$driver_options); // mix the arrays;
            self::$instance = parent::__construct($dsn, $username, $password, $options); // define $instance;
            $this->connected = true; // define $connected;
        }
        return self::$instance; // return the instance;
    }

}


אל תתייחסו לכל הקוד , אני הראיתי רק את הקטעים שעוסקים בסינגלטון.

6 תשובות

avatar ענה OrelBeY ב 18 לפברואר 2013 #

אני בטוח שחשבו על זה. מסתבר שהפתרון הכי טוב הוא בדרך שקראת עליה. :)

avatar ענה intval ב 18 לפברואר 2013 #

הבעיה היא שב-PHP אי אפשר להחזיר משהו בקונדסטרקטור:

public function __construct(){return 7;}

PHP תמיד תיצוא מופע חדש ותחזיר אותו, לא משנה איזה קוד תוסיף אתה בנוסף לתהליך הזה בתוך הפונקציה construct

avatar ענה iiddaannyy ב 18 לפברואר 2013 #

זה בלתי אפשרי לעשות ככה.
constructors לא מחזירים ערך. וגם אם תעשה return אז זה פשוט יפסיק את פעולת ה-constructor אבל הערך שתחזיר יהיה חסר כל משמעות.
בנוגע למשתנה static, זו לא בעיה לתקן את זה. הדבר הכי קרוב שאתה יכול לעשות הוא זה:
http://phpguide.co.il/phplive?code=667

במקרה הזה, אין לך פעולה סטטית שמחזירה את האובייקט היחידי של המחלקה. לכן כדי להשתמש באותו אובייקט תהיה תמיד חייב להיות בעל גישה אל ההפנייה אל אותו אובייקט (המשתנה ש"מחזיק" את האובייקט).

ככה שהבעיה בקוד שלך היא לא המשתנה instance, ובטח שאתה לא צריך להשתמש ב-globals. הבעיה היא שהערכים שה-constructor מחזיר הם חסרי ערך ואף אחד לא מתייחס אליהם.

avatar ענה משהה ב 19 לפברואר 2013 #

תודה רבה לכם :)
לא הבנתי בקוד שלך את השורה הזאת :

(self::$instance instanceof $this)


וסיימתי את המחלקה שלי(אם אפשר לקרוא לזה מחלקה חח הכנסתי בתוכה את הדברים הבסיסיים ביותר..): http://pastebin.com/46jJ7C9D אשמח אם תוכלו לתת לי ביקורת ומה צריך לתקן .. :)

זה הקוד המתוקן :
http://pastebin.com/8M3c8Bq5

avatar ענה iiddaannyy ב 19 לפברואר 2013 #

* ה-constructor שלך חייב להיות private כדי שלא יוכלו ליצור עצמים מהמחלקה שלך מבחוץ.

(self::$instance instanceof $this)
בודק האם המשתנה instance הוא עצם מהסוג של המחלקה הנוכחית.
בחפש בגוגל instanceof php (לא חייב php זה בכל השפות בעל אותה המשמעות).

avatar ענה משהה ב 21 לפברואר 2013 #

PDO לא מרשה קונסטרקטור מסוג private.. זה נותן לי שגיאה כזאתי...
אהה נחמד לדעת עלזה :) בחיים לא שמעתי על האופרטור הזה..תודה :)